ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด ์๋ฃจ์ ์ผ๋ก์ GraphQL Federation๊ณผ Schema Stitching์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์์๋ณด์ธ์. ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ํตํฉํ๊ณ , ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ, ๋ฐ์ดํฐ ํ์นญ์ ๋จ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด: GraphQL Federation ๋ฐ Schema Stitching
์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ธ๊ณ์์ ์ฌ๋ฌ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋นํ ์ด๋ ค์์ด ๋ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ์ฑํํจ์ ๋ฐ๋ผ, ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ํตํฉ๋๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ํ์์ฑ์ด ๋ฌด์๋ณด๋ค ์ค์ํด์ก์ต๋๋ค. ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ง์ ์ ์ญํ ์ ํ๋ฉฐ, ๋ค์ํ ๋ฐฑ์๋ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ ๊ฐ๋ฐ์์ ์ต์ข ์ฌ์ฉ์ ๋ชจ๋์๊ฒ ๊ฐ์ํ๋ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ๊ธฐ์ ์ธ GraphQL Federation๊ณผ Schema Stitching์ ์ดํด๋ด ๋๋ค.
ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ ๋ฌด์์ธ๊ฐ?
ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ ์ ์ฉ ์๋ฒ๊ฐ ํ๋ก ํธ์๋ ํด๋ผ์ด์ธํธ(์: ์น ๋ธ๋ผ์ฐ์ , ๋ชจ๋ฐ์ผ ์ฑ)์ ์ฌ๋ฌ ๋ฐฑ์๋ ์๋น์ค ๊ฐ์ ์ค๊ฐ์ ์ญํ ์ ํ๋ ์ํคํ ์ฒ ํจํด์ ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ ํ์นญ์ ๋จ์ํํฉ๋๋ค:
- ๋ฐ์ดํฐ ์ง๊ณ: ์ฌ๋ฌ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ๋จ์ผ ์๋ต์ผ๋ก ๊ฒฐํฉํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ณํ: ํ๋ก ํธ์๋์ ์๊ตฌ์ ๋ง๊ฒ ๋ฐ์ดํฐ ํ์์ ์กฐ์ ํฉ๋๋ค.
- ๋ณต์ก์ฑ ์ถ์ํ: ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐฑ์๋ ์๋น์ค์ ๋ณต์ก์ฑ์ ์จ๊น๋๋ค.
- ๋ณด์ ๊ฐํ: ์ธ์ฆ ๋ฐ ์ธ๊ฐ ์ ์ฑ ์ ๊ตฌํํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๊ณ ๋คํธ์ํฌ ์์ฒญ์ ์ค์ ๋๋ค.
๋ณธ์ง์ ์ผ๋ก, ์ด๋ Backend for Frontend (BFF) ํจํด์ ๋๊ท๋ชจ๋ก ๊ตฌํํ๋ฉฐ ํ๋ก ํธ์๋ ํ์ด ์๋นํ๋ API๋ฅผ ๋ ๋ง์ด ์ ์ดํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํฉ๋๋ค. ๋๊ท๋ชจ ์กฐ์ง์์๋ ํ๋ก ํธ์๋๊ฐ ์์ฒด API๋ฅผ ๊ด๋ฆฌํ๊ณ ํ๋ ์ด์ ํจ์ผ๋ก์จ ๋ ๋น ๋ฅธ ์ ํ ์ถ์์ ๋ฐฑ์๋ ํ์ ๋ํ ์์กด๋ ๊ฐ์๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด์ GraphQL์ ์ฌ์ฉํ๋ ์ด์
GraphQL์ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์ด์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ก ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํ ๋ฐํ์์ ๋๋ค. ์ด๋ ๊ธฐ์กด์ REST API์ ๋นํด ์ฌ๋ฌ ์ฅ์ ์ ์ ๊ณตํ์ฌ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด ๊ตฌ์ถ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค:
- ํจ์จ์ ์ธ ๋ฐ์ดํฐ ํ์นญ: ํด๋ผ์ด์ธํธ๋ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ์ฌ ์ค๋ฒ-ํ์นญ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๊ฐ๋ ฅํ ํ์ดํ: GraphQL ์คํค๋ง๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ์ฌ ๋ ๋์ ํด๋ง๊ณผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ธํธ๋ก์คํ์ (Introspection): ํด๋ผ์ด์ธํธ๋ ์คํค๋ง ์ธํธ๋ก์คํ์ ์ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ์์ ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ๊ธฐ๋ฅ: GraphQL ๊ตฌ๋ (Subscription)์ ์ค์๊ฐ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
GraphQL์ ํ์ฉํจ์ผ๋ก์จ, ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ ์ฌ๋ฌ ๋ฐฑ์๋ ์๋น์ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํ ์ ์ฐํ๊ณ ํจ์จ์ ์ด๋ฉฐ ๊ฐ๋ฐ์ ์นํ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ฟผ๋ฆฌํด์ผ ํ๊ณ ์ข ์ข ํ์ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ฌ๋ฌ REST ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ๋ฐฉ์๊ณผ ๊ทน๋ช ํ ๋์กฐ๋ฅผ ์ด๋ฃน๋๋ค.
GraphQL Federation: ๋ถ์ฐ ์ ๊ทผ ๋ฐฉ์
GraphQL Federation์ด๋ ๋ฌด์์ธ๊ฐ?
GraphQL Federation์ ์ฌ๋ฌ GraphQL ์๋น์ค(์๋ธ๊ทธ๋ํ(subgraph)๋ผ ๋ถ๋ฆผ)๋ฅผ ๋จ์ผ ํตํฉ ์คํค๋ง๋ก ๊ตฌ์ฑํ์ฌ ๋ถ์ฐ GraphQL API๋ฅผ ๊ตฌ์ถํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ๊ฐ ์๋ธ๊ทธ๋ํ๋ ํน์ ๋๋ฉ์ธ ๋๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ด๋นํ๋ฉฐ, Federation ๊ฒ์ดํธ์จ์ด๋ ์ด๋ฌํ ์๋ธ๊ทธ๋ํ ์ ๋ฐ์ ๊ฑธ์ณ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์จํฉ๋๋ค.
ํต์ฌ ๊ฐ๋ ์ ์ ์ฒด API๋ฅผ ๋ํ๋ด๋ ๋จ์ผ ํตํฉ GraphQL ์คํค๋ง์ธ ์ํผ๊ทธ๋ํ(supergraph)๋ฅผ ์ค์ฌ์ผ๋ก ํฉ๋๋ค. ์ด ์ํผ๊ทธ๋ํ๋ ๊ฐ๊ฐ ํน์ ๋ง์ดํฌ๋ก์๋น์ค ๋๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ํ๋ด๋ ๋ ์์ GraphQL ์คํค๋ง, ์ฆ ์๋ธ๊ทธ๋ํ(subgraph)๋ค์ ๊ตฌ์ฑํ์ฌ ๊ตฌ์ถ๋ฉ๋๋ค. Federation ๊ฒ์ดํธ์จ์ด๋ ๋ค์ด์ค๋ GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ ํ ์๋ธ๊ทธ๋ํ๋ก ๋ผ์ฐํ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋จ์ผ ์๋ต์ผ๋ก ๊ฒฐํฉํ๋ ์ญํ ์ ํฉ๋๋ค.
GraphQL Federation์ ์๋ ๋ฐฉ์
- ์๋ธ๊ทธ๋ํ ์ ์: ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ ์์ฒด ๋ฐ์ดํฐ์ ์์ ์ ์ ์ํ๋ GraphQL API(์๋ธ๊ทธ๋ํ)๋ฅผ ๋ ธ์ถํฉ๋๋ค. ์ด ์คํค๋ง์๋ Federation ๊ฒ์ดํธ์จ์ด์ ํ์ ๊ณผ ํ๋๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋ ์ง์๋ฌธ(directive)์ด ํฌํจ๋ฉ๋๋ค. ์ฃผ์ ์ง์๋ฌธ์ผ๋ก๋ `@key`, `@external`, `@requires`๊ฐ ์์ต๋๋ค.
- ์ํผ๊ทธ๋ํ ๊ตฌ์ฑ: Federation ๊ฒ์ดํธ์จ์ด(์: Apollo Gateway)๋ ๊ฐ ์๋ธ๊ทธ๋ํ์์ ์คํค๋ง๋ฅผ ๊ฒ์ํ์ฌ ๋จ์ผ ํตํฉ ์คํค๋ง(์ํผ๊ทธ๋ํ)๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์๋ ํ์ ๋ฐ ํ๋ ์ถฉ๋ ํด๊ฒฐ๊ณผ ๋ค๋ฅธ ์๋ธ๊ทธ๋ํ ๊ฐ์ ํ์ ๊ด๊ณ ์ค์ ์ด ํฌํจ๋ฉ๋๋ค.
- ์ฟผ๋ฆฌ ๊ณํ ๋ฐ ์คํ: ํด๋ผ์ด์ธํธ๊ฐ ๊ฒ์ดํธ์จ์ด๋ก GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๋ฉด ๊ฒ์ดํธ์จ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด๋ค ์๋ธ๊ทธ๋ํ๋ฅผ ์ฟผ๋ฆฌํด์ผ ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ ํ ์๋ธ๊ทธ๋ํ๋ก ๋ถ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์งํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋ ๋จ์ผ ์๋ต์ผ๋ก ๊ฒฐํฉํฉ๋๋ค.
์์: GraphQL Federation์ ์ฌ์ฉํ ์ ์์๊ฑฐ๋ ํ๋ซํผ
์ ํ, ๊ณ ๊ฐ, ์ฃผ๋ฌธ์ ์ํ ๋ณ๋์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์๊ฐํด ๋ด ์๋ค.
- ์ ํ ์๋ธ๊ทธ๋ํ: ์ ํ ์ ๋ณด(์ด๋ฆ, ์ค๋ช , ๊ฐ๊ฒฉ ๋ฑ)๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ๊ณ ๊ฐ ์๋ธ๊ทธ๋ํ: ๊ณ ๊ฐ ๋ฐ์ดํฐ(์ด๋ฆ, ์ฃผ์, ์ด๋ฉ์ผ ๋ฑ)๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฃผ๋ฌธ ์๋ธ๊ทธ๋ํ: ์ฃผ๋ฌธ ์ ๋ณด(์ฃผ๋ฌธ ID, ๊ณ ๊ฐ ID, ์ ํ ID, ์ด์ก ๋ฑ)๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๊ฐ ์๋ธ๊ทธ๋ํ๋ GraphQL API๋ฅผ ๋ ธ์ถํ๋ฉฐ, Federation ๊ฒ์ดํธ์จ์ด๋ ์ด๋ฌํ API๋ค์ ๋จ์ผ ์ํผ๊ทธ๋ํ๋ก ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ํผ๊ทธ๋ํ์ ์ฟผ๋ฆฌํ์ฌ ์ ํ, ๊ณ ๊ฐ, ์ฃผ๋ฌธ์ ๋ํ ์ ๋ณด๋ฅผ ๋จ์ผ ์์ฒญ์ผ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๊ณ ๊ฐ์ ์ด๋ฆ๊ณผ ์ฃผ๋ฌธ ๋ด์ญ์ ๊ฒ์ํ๋ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
query GetCustomerAndOrders($customerId: ID!) {
customer(id: $customerId) {
id
name
orders {
id
orderDate
totalAmount
}
}
}
Federation ๊ฒ์ดํธ์จ์ด๋ ์ด ์ฟผ๋ฆฌ๋ฅผ ๊ณ ๊ฐ ๋ฐ ์ฃผ๋ฌธ ์๋ธ๊ทธ๋ํ๋ก ๋ผ์ฐํ ํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ์ด๋ฅผ ๋จ์ผ ์๋ต์ผ๋ก ๊ฒฐํฉํฉ๋๋ค.
GraphQL Federation์ ์ด์
- ๋จ์ํ๋ ๋ฐ์ดํฐ ์ ๊ทผ: ํด๋ผ์ด์ธํธ๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์์ค์ ์๊ด์์ด ๋จ์ผ GraphQL ์๋ํฌ์ธํธ์ ์ํธ ์์ฉํฉ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ๊ฐ ์๋ธ๊ทธ๋ํ์์ ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฒ์ํ์ฌ ๋ฐ์ดํฐ ํ์นญ์ด ์ต์ ํ๋ฉ๋๋ค.
- ํ์ฅ์ฑ ์ฆ๊ฐ: ๊ฐ ์๋ธ๊ทธ๋ํ๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ๋ ์ ์์ด ๋ ๋์ ๋ฆฌ์์ค ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ถ์ฐ ๊ฐ๋ฐ: ํ์ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ธ๊ทธ๋ํ๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ ์ ์์ด ๋ฏผ์ฒฉ์ฑ๊ณผ ํ์ ์ ์ด์งํฉ๋๋ค.
- ์คํค๋ง ๊ฑฐ๋ฒ๋์ค: Federation ๊ฒ์ดํธ์จ์ด๋ ์๋ธ๊ทธ๋ํ ์ ๋ฐ์ ๊ฑธ์ณ ์คํค๋ง ์ผ๊ด์ฑ๊ณผ ํธํ์ฑ์ ๊ฐ์ ํฉ๋๋ค.
GraphQL Federation์ ์ํ ๋๊ตฌ
- Apollo Federation: GraphQL Federation์ ์ธ๊ธฐ ์๋ ์คํ ์์ค ๊ตฌํ์ผ๋ก, ๊ฒ์ดํธ์จ์ด, ์คํค๋ง ๋ ์ง์คํธ๋ฆฌ, ํ๋๋ ์ด์ ๋ GraphQL API๋ฅผ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ํด๋ง์ ์ ๊ณตํฉ๋๋ค. Apollo Federation์ ํ์ฅ์ฑ๊ณผ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ก ์ ๋ช ํฉ๋๋ค.
- GraphQL Hive: ์ด ๋๊ตฌ๋ GraphQL ํ๋๋ ์ด์ ์๋น์ค๋ฅผ ์ํ ์คํค๋ง ๋ ์ง์คํธ๋ฆฌ ๋ฐ ๊ฑฐ๋ฒ๋์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ณ๊ฒฝ ๊ฐ์ง, ์ฌ์ฉ๋ ๋ถ์, ์คํค๋ง ๊ฒ์ฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ํผ๊ทธ๋ํ์ ๋ํ ๊ฐ์์ฑ๊ณผ ์ ์ด๋ฅผ ํฅ์์ํต๋๋ค.
Schema Stitching: ๋์์ ์ ๊ทผ ๋ฐฉ์
Schema Stitching์ด๋ ๋ฌด์์ธ๊ฐ?
Schema Stitching์ ์ฌ๋ฌ GraphQL ์คํค๋ง๋ฅผ ๋จ์ผ ํตํฉ ์คํค๋ง๋ก ๊ฒฐํฉํ๋ ๋ ๋ค๋ฅธ ๊ธฐ์ ์ ๋๋ค. Federation๊ณผ ๋ฌ๋ฆฌ Schema Stitching์ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์คํค๋ง์ ํ์ ๊ณผ ํ๋๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง ์ ์ํ๋ ๋ฐ ๋ ์๋์ ์ธ ๊ณผ์ ์ ํฌํจํฉ๋๋ค. Federation์ด ๋ ํ๋์ ์ด๊ณ ๊ฒฌ๊ณ ํ ์๋ฃจ์ ์ผ๋ก ๊ฐ์ฃผ๋์ง๋ง, Schema Stitching์ ๋ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ ๊ธฐ์กด GraphQL API์์ ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ ์คํ ๊ฐ๋ฅํ ์ต์ ์ด ๋ ์ ์์ต๋๋ค.
Schema Stitching์ ์๋ ๋ฐฉ์
- ์คํค๋ง ์ ์: ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ ์์ฒด ์คํค๋ง๋ฅผ ๊ฐ์ง GraphQL API๋ฅผ ๋ ธ์ถํฉ๋๋ค.
- ์คํฐ์นญ ๋ก์ง: ์คํฐ์นญ ๊ณ์ธต(์ข ์ข GraphQL Tools์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋จ)์ ๋ค๋ฅธ ์คํค๋ง์ ํ์ ๊ณผ ํ๋๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ ์๋น์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํตํฉ ์คํค๋ง์ ๋งคํํ๋ ๋ฆฌ์กธ๋ฒ(resolver) ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
- ํตํฉ ์คํค๋ง: ์คํฐ์นญ ๊ณ์ธต์ ๊ฐ๋ณ ์คํค๋ง๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ ธ์ถ๋๋ ๋จ์ผ ํตํฉ ์คํค๋ง๋ก ๊ฒฐํฉํฉ๋๋ค.
์์: ์ ํ๊ณผ ๋ฆฌ๋ทฐ ์คํฐ์นญ
์ ํ์ฉ๊ณผ ๋ฆฌ๋ทฐ์ฉ, ๋ ๊ฐ์ ๋ณ๋ GraphQL ์๋น์ค๊ฐ ์๋ค๊ณ ์์ํด ๋ด ์๋ค.
- ์ ํ ์๋น์ค: ์ ํ์ ๋ํ ์ ๋ณด(ID, ์ด๋ฆ, ์ค๋ช , ๊ฐ๊ฒฉ)๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ฆฌ๋ทฐ ์๋น์ค: ์ ํ์ ๋ํ ๋ฆฌ๋ทฐ(ID, ์ ํ ID, ํ์ , ์ฝ๋ฉํธ)๋ฅผ ์ ๊ณตํฉ๋๋ค.
Schema Stitching์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋จ์ผ ์ฟผ๋ฆฌ๋ก ์ ํ ์ ๋ณด์ ๋ฆฌ๋ทฐ๋ฅผ ๊ฒ์ํ ์ ์๋ ํตํฉ ์คํค๋ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์คํฐ์นญ ๊ณ์ธต์์ ์ฃผ์ด์ง ์ ํ ID์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ๋ฆฌ๋ทฐ ์๋น์ค์์ ๊ฐ์ ธ์ ํตํฉ ์คํค๋ง์ Product ํ์ ์ ์ถ๊ฐํ๋ ๋ฆฌ์กธ๋ฒ ํจ์๋ฅผ ์ ์ํ๊ฒ ๋ฉ๋๋ค.
// ์์ (๊ฐ๋
์ ): GraphQL Tools๋ฅผ ์ฌ์ฉํ ์คํฐ์นญ ๋ก์ง
const { stitchSchemas } = require('@graphql-tools/stitch');
const productsSchema = ... // ์ ํ ์คํค๋ง ์ ์
const reviewsSchema = ... // ๋ฆฌ๋ทฐ ์คํค๋ง ์ ์
const stitchedSchema = stitchSchemas({
subschemas: [
{
schema: productsSchema,
},
{
schema: reviewsSchema,
transforms: [
{
transformSchema: (schema) => schema,
transformRequest: (originalRequest) => {
return originalRequest;
},
transformResult: (originalResult) => {
return originalResult;
}
}
],
},
],
typeDefs: `
extend type Product {
reviews: [Review]
}
`,
resolvers: {
Product: {
reviews: {
resolve: (product, args, context, info) => {
// Reviews ์๋น์ค์์ ํด๋น ์ ํ์ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ ธ์ด
return fetchReviewsForProduct(product.id);
},
},
},
},
});
์ด ์์๋ ์คํค๋ง๋ฅผ ํจ๊ป ์คํฐ์นญํ๋ ํต์ฌ ๊ฐ๋ ์ ๋ณด์ฌ์ค๋๋ค. `reviews` ํ๋๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ปค์คํ ๋ฆฌ์กธ๋ฒ๊ฐ ํ์ํ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ๊ฐ ๊ด๊ณ์ ๋ํด ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฝ๋ฉํด์ผ ํ๋ ์ด๋ฌํ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๋ ๊ฐ๋ฐ ๊ณผ์ ์ Federation์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋๋ฆฌ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
Schema Stitching์ ์ด์
- ํตํฉ API: ํด๋ผ์ด์ธํธ๋ ๋จ์ผ GraphQL ์๋ํฌ์ธํธ์ ์ก์ธ์คํ์ฌ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋จ์ํํฉ๋๋ค.
- ์ ์ง์ ๋์ : Schema Stitching์ ์ ์ง์ ์ผ๋ก ๊ตฌํํ ์ ์์ด ํตํฉ API๋ก ์ ์ฐจ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- ์ ์ฐ์ฑ: Schema Stitching์ ์คํค๋ง๋ฅผ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ๋ง์ ์ ์ด๊ถ์ ์ ๊ณตํ์ฌ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์คํฐ์นญ ๋ก์ง์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
Schema Stitching์ ๋จ์
- ์๋ ์ค์ : Schema Stitching์ ์คํฐ์นญ ๋ก์ง์ ์๋ ์ค์ ์ ํ์๋ก ํ๋ฉฐ, ์ด๋ ๋ณต์กํ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ์ค๋ฒํค๋: ๋ฆฌ์กธ๋ฒ ํจ์๋ ํนํ ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ ํฌํจํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์ ํ๋ ํ์ฅ์ฑ: Schema Stitching์ ์คํฐ์นญ ๋ก์ง์ด ์ผ๋ฐ์ ์ผ๋ก ์ค์ ์ง์คํ๋์ด ์์ด Federation๋ณด๋ค ํ์ฅํ๊ธฐ๊ฐ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์คํค๋ง ์์ ๊ถ: ํนํ ๋ค๋ฅธ ํ์ด ์คํฐ์นญ๋ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ์คํค๋ง ์์ ๊ถ์ ๋ํ ๋ชจํธ์ฑ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
Schema Stitching์ ์ํ ๋๊ตฌ
- GraphQL Tools: Schema Stitching ์ง์์ ํฌํจํ์ฌ GraphQL ์คํค๋ง๋ฅผ ๊ตฌ์ถํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- GraphQL Mesh: GraphQL Mesh๋ฅผ ์ฌ์ฉํ๋ฉด GraphQL ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ REST API, ๋ฐ์ดํฐ๋ฒ ์ด์ค, gRPC์ ๊ฐ์ ๋ค์ํ ์์ค์ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ฌํ API๋ค์ ํตํฉ๋ GraphQL ์คํค๋ง๋ก ์คํฐ์นญํ ์ ์์ต๋๋ค.
GraphQL Federation vs. Schema Stitching: ๋น๊ต
GraphQL Federation๊ณผ Schema Stitching์ ๋ชจ๋ ์ฌ๋ฌ GraphQL ์คํค๋ง๋ฅผ ๋จ์ผ API๋ก ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ธฐ๋ฅ ๋ฉด์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
| ๊ธฐ๋ฅ | GraphQL Federation | Schema Stitching |
|---|---|---|
| ์ ๊ทผ ๋ฐฉ์ | ๋ถ์ฐ์ , ์๋ํ๋ ๊ตฌ์ฑ | ์ค์ ์ง์ค์ , ์๋ ์ค์ |
| ๋ณต์ก์ฑ | ์ ์ง ๋ฐ ํ์ฅ์ ๋ํ ๋ณต์ก์ฑ ๋ฎ์ | ์๋ ๋ฆฌ์กธ๋ฒ ๋ก์ง์ผ๋ก ์ธํ ๋ณต์ก์ฑ ๋์ |
| ํ์ฅ์ฑ | ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ์ ์ํด ์ค๊ณ๋จ | ํ์ฅ์ฑ์ด ๋ฎ๊ณ , ์ผ๋ฐ์ ์ผ๋ก ์๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋จ |
| ์คํค๋ง ๊ฑฐ๋ฒ๋์ค | ๋ด์ฅ๋ ์คํค๋ง ๊ฑฐ๋ฒ๋์ค ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ | ์๋ ์คํค๋ง ๊ด๋ฆฌ ๋ฐ ์กฐ์ ํ์ |
| ํด๋ง | ๊ฐ๋ ฅํ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ (์: Apollo Federation) | ๋ ๋ง์ ์ปค์คํ ํด๋ง ๋ฐ ์ค์ ํ์ |
| ์ฌ์ฉ ์ฌ๋ก | ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ, ๋๊ท๋ชจ API, ๋ถ์ฐ ๊ฐ๋ฐ | ์๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ , ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ , ํน์ ์ปค์คํฐ๋ง์ด์ง ์๊ตฌ์ฌํญ |
GraphQL Federation์ ์ฌ์ฉํด์ผ ํ ๋: ๋ณต์กํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , API๋ฅผ ํ์ฅํด์ผ ํ๋ฉฐ, ๋ ๋ฆฝ์ ์ธ ํ์ด ์์ฒด ์๋ธ๊ทธ๋ํ๋ฅผ ๊ด๋ฆฌํ๋๋ก ๊ถํ์ ๋ถ์ฌํ๊ณ ์ถ์ ๋ Federation์ ์ ํํ์ญ์์ค. ๋ํ ์คํค๋ง ๊ด๋ฆฌ์ ๊ฑฐ๋ฒ๋์ค๋ฅผ ๋จ์ํํฉ๋๋ค.
Schema Stitching์ ์ฌ์ฉํด์ผ ํ ๋: ๋ ๊ฐ๋จํ API๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋, ์คํฐ์นญ ๋ก์ง์ ๋ํ ๋ ๋ง์ ์ ์ด๊ฐ ํ์ํ๊ฑฐ๋, ๊ธฐ์กด GraphQL API์์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒฝ์ฐ Schema Stitching์ ๊ณ ๋ คํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ ์ฌ์ ์ธ ๋ณต์ก์ฑ๊ณผ ํ์ฅ์ฑ ์ ํ์ ์ ์ํด์ผ ํฉ๋๋ค.
์ธ์ฆ ๋ฐ ์ธ๊ฐ ๊ตฌํ
GraphQL Federation์ด๋ Schema Stitching ์ค ์ด๋ ๊ฒ์ ์ ํํ๋ , ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ธ์ฆ ๋ฐ ์ธ๊ฐ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ์ทจํ ์ ์์ต๋๋ค:
- ๊ฒ์ดํธ์จ์ด ์์ค ์ธ์ฆ: API ๊ฒ์ดํธ์จ์ด๋ ์์ฒญ์ ๋ฐฑ์๋ ์๋น์ค๋ก ๋ผ์ฐํ ํ๊ธฐ ์ ์ ์ธ์ฆ ๋ฐ ์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ณด์ ๋ก์ง์ ์ค์ ์ง์คํํ๊ณ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๋จ์ํํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ JWT(JSON ์น ํ ํฐ) ๊ฒ์ฆ๊ณผ OAuth 2.0์ด ์์ต๋๋ค.
- ์๋น์ค ์์ค ์ธ์ฆ: ๊ฐ ๋ฐฑ์๋ ์๋น์ค๊ฐ ์์ฒด ์ธ์ฆ ๋ฐ ์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ณด์์ ๋ํ ๋ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
- ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์: ๊ฒ์ดํธ์จ์ด ์์ค๊ณผ ์๋น์ค ์์ค ์ธ์ฆ์ ์กฐํฉ์ ๋๋ค. ๊ฒ์ดํธ์จ์ด๊ฐ ์ด๊ธฐ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ ๋ฐฑ์๋ ์๋น์ค๊ฐ ๋ ์ธ๋ถํ๋ ์ธ๊ฐ ํ์ธ์ ์ํํฉ๋๋ค.
์์: Apollo Federation์ ์ฌ์ฉํ JWT ์ธ์ฆ
Apollo Federation์ ์ฌ์ฉํ๋ฉด ๊ฒ์ดํธ์จ์ด๊ฐ ์์ฒญ ํค๋์ ํฌํจ๋ JWT ํ ํฐ์ ๊ฒ์ฆํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฒ์ดํธ์จ์ด๋ ํ ํฐ์์ ์ถ์ถํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ธ๊ทธ๋ํ๋ก ์ ๋ฌํ ์ ์์ผ๋ฉฐ, ์๋ธ๊ทธ๋ํ๋ ์ด ์ ๋ณด๋ฅผ ์ธ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ์์ (๊ฐ๋
์ ): JWT ๊ฒ์ฆ์ ํฌํจํ Apollo Gateway ์ค์
const { ApolloGateway } = require('@apollo/gateway');
const gateway = new ApolloGateway({
serviceList: [
// ... ์๋ธ๊ทธ๋ํ ์ค์
],
buildService: ({ name, url }) => {
return new MyCustomService({
name, // ์๋ธ๊ทธ๋ํ ์ด๋ฆ
url, // ์๋ธ๊ทธ๋ํ URL
});
},
});
class MyCustomService extends RemoteGraphQLDataSource {
willSendRequest({ request, context }) {
// ์ปจํ
์คํธ์์ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
const user = context.user;
// ์์ฒญ ํค๋์ ์ฌ์ฉ์ ID ์ถ๊ฐ
if (user) {
request.http.headers.set('user-id', user.id);
}
}
}
์ด ์์์์๋ JWT์์ ํ์๋ ์ฌ์ฉ์ ID๋ฅผ ํฌํจํ๋๋ก ๋๊ฐ๋ ์์ฒญ์ ์์ ํ๊ธฐ ์ํด ์ปค์คํ ์๋น์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ค์ด์คํธ๋ฆผ ์๋น์ค๋ ์ด ID๋ฅผ ์ธ๊ฐ ํ์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์บ์ฑ ์ ๋ต
์บ์ฑ์ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ํ์์ ์ ๋๋ค. ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํจ์ผ๋ก์จ ๋ฐฑ์๋ ์๋น์ค์ ๋ถํ๋ฅผ ์ค์ด๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์บ์ฑ ์ ๋ต์ ๋๋ค:
- HTTP ์บ์ฑ: HTTP ์บ์ฑ ๋ฉ์ปค๋์ฆ(์: `Cache-Control` ํค๋)์ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ค๊ฐ ํ๋ก์์ ์๋ต์ ์บ์ํฉ๋๋ค.
- ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ: ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์(์: Redis, Memcached)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ดํธ์จ์ด์์ ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ํฉ๋๋ค.
- CDN ์บ์ฑ: ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๋ฅผ ํ์ฉํ์ฌ ์ ์ ์์ฐ๊ณผ API ์๋ต์ ํด๋ผ์ด์ธํธ์ ๋ ๊ฐ๊น์ด ๊ณณ์ ์บ์ํฉ๋๋ค.
- GraphQL ์ฟผ๋ฆฌ ์บ์ฑ: GraphQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ฟผ๋ฆฌ ๋ฌธ์์ด๊ณผ ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์บ์ํฉ๋๋ค. ์ด๋ ์์ฃผ ์คํ๋๋ ์ฟผ๋ฆฌ์ ํนํ ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค. Apollo Server๋ ์ฟผ๋ฆฌ ์บ์ฑ์ ๋ด์ฅ ์ง์ํฉ๋๋ค.
์บ์ฑ์ ๊ตฌํํ ๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ก ์บ์ ๋ฌดํจํ ์ ๋ต์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ: ์บ์๋ ๋ฐ์ดํฐ์ ๊ณ ์ ๋ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํฉ๋๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฌดํจํ: ๋ฐฑ์๋ ์๋น์ค์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ฅผ ๋ฌดํจํํฉ๋๋ค. ์ด๋ ์นํ ์ด๋ ๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๋ชจ๋ํฐ๋ง ๋ฐ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ
๋ชจ๋ํฐ๋ง๊ณผ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ์ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด์ ์ํ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ์งํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ๋ชจ๋ํฐ๋ง์ ๊ตฌํํ์ญ์์ค:
- ์์ฒญ ์ง์ฐ ์๊ฐ: ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
- ์ค๋ฅ์จ: ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ์์ฒญ์ ๋น์จ์ ๋๋ค.
- ์ฒ๋ฆฌ๋: ๋จ์ ์๊ฐ๋น ์ฒ๋ฆฌ๋๋ ์์ฒญ ์์ ๋๋ค.
- ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ : ๊ฒ์ดํธ์จ์ด ๋ฐ ๋ฐฑ์๋ ์๋น์ค์ CPU, ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ์ฌ์ฉ๋์ ๋๋ค.
์ถ์ (tracing)์ ์ฌ์ฉํ์ฌ ์์คํ ์ ํตํด ํ๋ฅด๋ ์์ฒญ์ ์ถ์ ํ๊ณ ๋ณ๋ชฉ ํ์๊ณผ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ์ญ์์ค. ๋ก๊น ์ ๊ฒ์ดํธ์จ์ด ๋ฐ ๋ฐฑ์๋ ์๋น์ค์ ๋์์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ชจ๋ํฐ๋ง ๋ฐ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ์ ์ํ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Prometheus: ์คํ ์์ค ๋ชจ๋ํฐ๋ง ๋ฐ ๊ฒฝ๊ณ ์์คํ ์ ๋๋ค.
- Grafana: ๋ฐ์ดํฐ ์๊ฐํ ๋ฐ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ ๋๋ค.
- Jaeger: ์คํ ์์ค ๋ถ์ฐ ์ถ์ ์์คํ ์ ๋๋ค.
- Datadog: ํด๋ผ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ณด์ ํ๋ซํผ์ ๋๋ค.
- New Relic: ์ํํธ์จ์ด ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ๊ธฐ ์ํ ๋์งํธ ์ธํ ๋ฆฌ์ ์ค ํ๋ซํผ์ ๋๋ค.
๊ฐ๋ ฅํ ๋ชจ๋ํฐ๋ง๊ณผ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ์ ๊ตฌํํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํ์ฌ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
GraphQL Federation ๋๋ Schema Stitching์ผ๋ก ๊ตฌ์ถ๋ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ ์ ๊ทผ์ ํฌ๊ฒ ๋จ์ํํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. GraphQL Federation์ ๋ถ์ฐ GraphQL API๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, Schema Stitching์ ๊ธฐ์กด ์คํค๋ง๋ฅผ ๊ฒฐํฉํ๊ธฐ ์ํ ๋ ์ ์ฐํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ์ด๋ฌํ ๊ธฐ์ ๊ฐ์ ์ฅ๋จ์ ์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ํ๋ก ํธ์๋ API ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ต์์ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ ์ ์์ต๋๋ค.
๊ฒ์ดํธ์จ์ด์ ๋ณด์, ์ฑ๋ฅ ๋ฐ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ ํ ์ธ์ฆ ๋ฐ ์ธ๊ฐ, ์บ์ฑ ์ ๋ต, ๋ชจ๋ํฐ๋ง ๋ฐ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ์ ๊ตฌํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฑํํจ์ผ๋ก์จ GraphQL์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ณ ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.